//-
// ==========================================================================
// Copyright (C) 1995 - 2006 Autodesk, Inc. and/or its licensors.  All 
// rights reserved.
//
// The coded instructions, statements, computer programs, and/or related 
// material (collectively the "Data") in these files contain unpublished 
// information proprietary to Autodesk, Inc. ("Autodesk") and/or its 
// licensors, which is protected by U.S. and Canadian federal copyright 
// law and by international treaties.
//
// The Data is provided for use exclusively by You. You have the right 
// to use, modify, and incorporate this Data into other products for 
// purposes authorized by the Autodesk software license agreement, 
// without fee.
//
// The copyright notices in the Software and this entire statement, 
// including the above license grant, this restriction and the 
// following disclaimer, must be included in all copies of the 
// Software, in whole or in part, and all derivative works of 
// the Software, unless such copies or derivative works are solely 
// in the form of machine-executable object code generated by a 
// source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. 
// AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED 
// WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF 
// NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 
// PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE, OR 
// TRADE PRACTICE. IN NO EVENT WILL AUTODESK AND/OR ITS LICENSORS 
// BE LIABLE FOR ANY LOST REVENUES, DATA, OR PROFITS, OR SPECIAL, 
// DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK 
// AND/OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY 
// OR PROBABILITY OF SUCH DAMAGES.
//
// ==========================================================================
//+

//
// Define declarations
//

#include "rockingTransform.h"

#define kRockingTransformCheckNodeID 0x8101D
#define kRockingTransformCheckMatrixID 0x8101E

#define ReturnOnError(status)			   \
		if (MS::kSuccess != status) {	   \
			return status;				  \
		}

//
// Class declarations -- matrix and transform
// NOTE: that we derive from the rockingTransform base
// classes so that we avoid code duplication.
//

class rockingTransformCheckMatrix : public rockingTransformMatrix
{
	// A really simple implementation of MPxTransformationMatrix.
	// The methods include:
	// - Two accessor methods for getting and setting the 
	// rock
	// - The virtual asMatrix() method which passes the matrix 
	// back to Maya when the command "xform -q -ws -m" is invoked

	public:
		rockingTransformCheckMatrix();
		static void *creator();
				
		static	MTypeId	idCheck;
	private:		
		typedef rockingTransformCheckMatrix ParentClass;
};

class rockingTransformCheckNode : public rockingTransformNode 
{
	public:
		// A really simple custom transform.
		rockingTransformCheckNode();
		rockingTransformCheckNode(MPxTransformationMatrix *);
		virtual ~rockingTransformCheckNode();

		virtual MPxTransformationMatrix *createTransformationMatrix();
										
		// Utility for getting the related rock matrix pointer
		rockingTransformCheckMatrix *getRockingTransformCheckMatrix();
				
		const char* className();
		static	void * 	creator();
		
		static	MTypeId	idCheck;
		
	protected:
		virtual	MEulerRotation applyRotationLocks(const MEulerRotation &toTest,
											const MEulerRotation &savedR,
											MStatus *ReturnStatus = NULL);
		virtual MEulerRotation applyRotationLimits(const MEulerRotation &unclampedR,
											  MDataBlock &block,
											  MStatus *ReturnStatus = NULL);
		virtual	MStatus checkAndSetRotation(MDataBlock &block,
											const MPlug&,
											const MEulerRotation&, 
											MSpace::Space = MSpace::kTransform);  

	
	private:
		typedef rockingTransformNode ParentClass;
};


